home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Mail / pgpservice / Text.m < prev   
Text File  |  1993-06-03  |  5KB  |  223 lines

  1. /* File: Text.m - (Interactive) Unix shell version of Text
  2.  *
  3.  * By: Gerben Wierda (gerben@rna.indiv.nluug.nl)
  4.  * As inspired by Christopher Lane (lane@sumex-aim.stanford.edu)
  5.  *
  6.  * Date: 2 may 1993
  7.  *
  8.  * Copyright: 1993 by R&A
  9.  *
  10.  * This program may be distributed without restriction.
  11.  */
  12.  
  13. // A very long line to see if everyhting is displayed OK. A very long line to see if everyhting is displayed OK. A very long line to see if everyhting is displayed OK.
  14.  
  15. #import <stdlib.h>
  16. #import "getopt.h"
  17.  
  18. #import <appkit/appkit.h>
  19.  
  20. #define SELECTOR @selector(stop:)
  21. #define TIMEOUT (30)
  22.  
  23. #define DEFAULTWIDTH    400.0
  24. #define DEFAULTHEIGHT    400.0
  25. #define DEFAULTX    150.0
  26. #define DEFAULTY    750.0
  27.  
  28. #define USAGE "usage: %s [-t title] [-x xpos -y ypos] [-T seconds] [file]\n"
  29. #define EXIT_USAGE (2)
  30.  
  31. @interface TextApp : Application
  32. {
  33.     id window;
  34.     int startcount;
  35. }
  36.  
  37. - initWindow;
  38. - appDidInit:sender;
  39.  
  40. @end
  41.  
  42. @implementation TextApp : Application
  43.  
  44. - initWindow
  45. {
  46.     NXRect windowrect;
  47.  
  48.     NXSetRect( &windowrect, DEFAULTX, DEFAULTY,
  49.            DEFAULTWIDTH, DEFAULTHEIGHT);
  50.     window = [[Window alloc]
  51.           initContent:  &windowrect
  52.           style:        NX_RESIZEBARSTYLE
  53.           backing:        NX_BUFFERED
  54.           buttonMask:   NX_CLOSEBUTTONMASK
  55.           defer:        NO];
  56.     [window setContentView:[[ScrollView alloc] initFrame:&windowrect]];
  57.     [[window contentView] setDocView:[[Text alloc] initFrame:&windowrect]];
  58.  
  59.     return window;
  60. }
  61.  
  62. - appDidInit:sender
  63. {
  64.     [[self appIcon] orderOut:self];
  65.  
  66.     return self;
  67. }
  68.  
  69. @end
  70.  
  71. void timer(DPSTimedEntry teNumber, double now, int status) { exit(status); }
  72.  
  73. void main(int argc, char *argv[])
  74. {
  75.     BOOL orderFront = NO;
  76.     const char *title = NULL;
  77.     double timeout = TIMEOUT;
  78.     int option, status = EXIT_SUCCESS;
  79.     NXPoint topleft = { DEFAULTX, DEFAULTY };
  80.     NXSize size = { DEFAULTWIDTH, DEFAULTHEIGHT };
  81.     DPSTimedEntry teNumber = NULL;
  82.     NXStream *stream = NULL;
  83.     
  84.     while ((option = getopt(argc, argv, "Fc:t:x:y:X:Y:T:")) != EOF)
  85.     switch (option)
  86.     {
  87.     case 'F': orderFront = YES; break;
  88.     case 't': title = optarg; break;
  89.     case 'x': topleft.x = atof(optarg); break;
  90.     case 'y': topleft.y = atof(optarg); break;
  91.     case 'X': size.width = atof(optarg); break;
  92.     case 'Y': size.height = atof(optarg); break;
  93.     case 'T': timeout = atol(optarg); break;
  94.     default : status = EXIT_USAGE;
  95.     }
  96.     
  97.     NXApp = [TextApp new];
  98.  
  99.     if (status == EXIT_USAGE)
  100.     {
  101.     (void) fprintf(stderr, USAGE, [NXApp appName]);
  102.     }
  103.     else
  104.     {
  105.     float xdisplacement = 0.0;
  106.     float ydisplacement = 0.0;
  107.     
  108.     for (; optind < argc; optind++)
  109.     {
  110.         if (stream = (strcmp( argv[optind], "-") ?
  111.               NXMapFile( argv[optind], NX_READWRITE) :
  112.               NXOpenFile(fileno( stdin), NX_READONLY)))
  113.         {
  114.         NXRect windowrect, textrect;
  115.         id window;
  116.         id scrollview;
  117.         id text;
  118.  
  119.         window = [NXApp initWindow];
  120.         [window setDelegate:NXApp];
  121.         scrollview = [window contentView];
  122.         text = [scrollview docView];
  123.         
  124.         [window setTitle:(title == NULL ?
  125.                   (strcmp( argv[optind], "-") ?
  126.                    argv[optind]: "<<stdin>>") :
  127.                   title)];
  128.         [window displayBorder];
  129.         [window setBackgroundGray:NX_LTGRAY];
  130.  
  131.         [window sizeWindow:size.width :size.height];
  132.         [window moveTopLeftTo:topleft.x :topleft.y];
  133.  
  134.         if (xdisplacement != 0.0 ||
  135.             ydisplacement != 0.0)
  136.         {
  137.             [window getFrame:&windowrect];
  138.             windowrect.origin.x += xdisplacement;
  139.             windowrect.origin.y += ydisplacement;
  140.             [window moveTo:windowrect.origin.x :windowrect.origin.y];
  141.         }
  142.         xdisplacement += 18.0;
  143.         ydisplacement -= 18.0;
  144.         
  145.         [scrollview setVertScrollerRequired:YES];
  146.         [scrollview setHorizScrollerRequired:NO];
  147.         [scrollview getContentSize:&textrect.size];
  148.  
  149.         [text setHorizResizable:NO];
  150.         [text setVertResizable:YES];
  151.         [text setMinSize:&textrect.size];
  152.         [text sizeTo:textrect.size.width :textrect.size.height];
  153.         [text setOpaque:YES];
  154.         [text setEditable:NO];
  155.         [text readText:stream];
  156.         [text sizeToFit];
  157.  
  158.         if (orderFront)
  159.         {
  160.             [window orderFrontRegardless];
  161.         }
  162.         else
  163.         {
  164.             [window orderFront:nil];
  165.         }
  166.         [window display];
  167.  
  168.         NXClose( stream);
  169.         }
  170.     }
  171.     if (timeout)
  172.     {
  173.         teNumber = DPSAddTimedEntry( timeout,
  174.                      (DPSTimedEntryProc) &timer,
  175.                      (void *) EXIT_FAILURE,
  176.                      NX_BASETHRESHOLD);
  177.     }
  178.  
  179.     [NXApp run];
  180.     
  181.     if(timeout) DPSRemoveTimedEntry(teNumber);
  182.     }
  183.     [NXApp free];
  184.  
  185.     exit(status);
  186. }
  187.  
  188. @interface TextApp(WindowDelegate)
  189. - windowWillClose:sender;
  190. - windowDidResize:sender;
  191. @end
  192.  
  193. @implementation TextApp(WindowDelegate)
  194. - windowWillClose:sender
  195. {
  196.     if ([[NXApp windowList] count] <= 4)
  197.     {
  198.     [NXApp terminate:nil];
  199.     }
  200.     return self;
  201. }
  202. - windowDidResize:sender
  203. {
  204.     NXRect textrect;
  205.     
  206.     [[sender contentView] getContentSize:&textrect.size];
  207.  
  208.     [[[sender contentView] docView] setMinSize:&textrect.size];
  209.     [[[sender contentView] docView]
  210.      sizeTo:textrect.size.width :textrect.size.height];
  211.     [[[sender contentView] docView] sizeToFit];
  212.  
  213. //    [sender display];
  214.     return self;
  215. }
  216. @end
  217.  
  218. @interface TextApp(TextDelegate)
  219. @end
  220.  
  221. @implementation TextApp(TextDelegate)
  222. @end
  223.